package com.example.docmanagement.config;

import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * MinIO 配置类
 * 负责配置和初始化 MinIO 客户端
 * 
 * MinIO 服务器信息：
 * - 地址：192.168.1.86:9000
 * - 账号：esun
 * - 密码：12345678
 * 
 * Bucket 配置：
 * - doc-images：文档图片（Public）
 * - doc-contents：Markdown 文件（Public/Private）
 * - doc-attachments：文档附件（Private）
 * - user-avatars：用户头像（Public）
 * - thumbnails：缩略图（Public）
 */
@Configuration
@ConfigurationProperties(prefix = "minio")
@Data
public class MinioConfig {

    /**
     * MinIO 服务器地址
     * 示例：http://192.168.1.86:9000
     */
    private String endpoint = "http://192.168.1.86:9000";

    /**
     * MinIO 访问密钥（Access Key）
     */
    private String accessKey = "esun";

    /**
     * MinIO 密钥（Secret Key）
     */
    private String secretKey = "12345678";

    /**
     * Bucket 名称配置
     */
    private BucketConfig buckets = new BucketConfig();

    /**
     * 上传配置
     */
    private UploadConfig upload = new UploadConfig();

    /**
     * Bucket 配置类
     */
    @Data
    public static class BucketConfig {
        /**
         * 文档图片 Bucket（公开访问）
         */
        private String docImages = "doc-images";

        /**
         * Markdown 文件 Bucket（公开/私有）
         */
        private String docContents = "doc-contents";

        /**
         * 文档附件 Bucket（私有访问）
         */
        private String docAttachments = "doc-attachments";

        /**
         * 用户头像 Bucket（公开访问）
         */
        private String userAvatars = "user-avatars";

        /**
         * 缩略图 Bucket（公开访问）
         */
        private String thumbnails = "thumbnails";

        /**
         * 临时文件 Bucket（私有，7天自动删除）
         */
        private String tempUploads = "temp-uploads";
    }

    /**
     * 上传配置类
     */
    @Data
    public static class UploadConfig {
        /**
         * 单文件最大大小（字节），默认 100MB
         */
        private Long maxFileSize = 100L * 1024 * 1024;

        /**
         * 批量上传最大文件数
         */
        private Integer maxBatchSize = 10;

        /**
         * 图片类型白名单
         */
        private String[] allowedImageTypes = {
            "image/jpeg",
            "image/png",
            "image/gif",
            "image/webp",
            "image/svg+xml"
        };

        /**
         * 文档类型白名单
         */
        private String[] allowedDocumentTypes = {
            "application/pdf",
            "application/msword",
            "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
            "application/vnd.ms-excel",
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            "application/vnd.ms-powerpoint",
            "application/vnd.openxmlformats-officedocument.presentationml.presentation",
            "application/zip",
            "application/x-rar-compressed",
            "text/plain",
            "text/markdown"
        };

        /**
         * 图片压缩质量（0.0 - 1.0）
         */
        private Float imageQuality = 0.85f;

        /**
         * 缩略图宽度（像素）
         */
        private Integer thumbnailWidth = 200;

        /**
         * 缩略图高度（像素）
         */
        private Integer thumbnailHeight = 200;

        /**
         * 内容大小阈值（字节）
         * 超过此大小的文档内容自动存储到 MinIO
         */
        private Long contentSizeThreshold = 500L * 1024;  // 500KB
    }

    /**
     * 创建 MinIO 客户端 Bean
     * 
     * @return MinIO 客户端实例
     */
    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
    }
}

